Entity Framework (EF) Core একটি শক্তিশালী ORM (Object-Relational Mapping) টুল যা ডেটাবেসের সাথে কাজ করতে ব্যবহৃত হয়, তবে যখন আপনি ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করেন, তখন নিরাপত্তা একটি অত্যন্ত গুরুত্বপূর্ণ বিষয়। EF Core-এর সাথে কাজ করার সময় বিভিন্ন নিরাপত্তা ফিচার ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনকে সুরক্ষিত রাখতে পারেন। এটি SQL Injection প্রতিরোধ, ডেটা এনক্রিপশন, Sensitive Data হ্যান্ডলিং, এবং Authorization সম্পর্কিত বিভিন্ন বিষয় নিয়ে কাজ করে।
এখানে EF Core-এর কিছু গুরুত্বপূর্ণ Security Features নিয়ে আলোচনা করা হয়েছে:
SQL Injection হল একটি নিরাপত্তা ঝুঁকি যেখানে আক্রমণকারীরা অ্যাপ্লিকেশনের কুয়েরি স্ট্রিংয়ে কৃত্রিম SQL কোড ইনপুট করে, যা ডেটাবেসের সাথে অবাঞ্ছিত আচরণ ঘটাতে পারে। EF Core এ LINQ (Language Integrated Query) ব্যবহার করা হলে, SQL Injection স্বয়ংক্রিয়ভাবে প্রতিরোধ করা হয় কারণ LINQ কুয়েরি তৈরি করার সময় এটি SQL কুয়েরি স্ট্রিংয়ে কাস্টম কোড ইনপুট করার সুযোগ দেয় না।
var users = context.Users
.Where(u => u.Name == userName) // LINQ query - Safe from SQL Injection
.ToList();
এখানে, LINQ ব্যবহার করা হচ্ছে, যা SQL ইনজেকশন প্রতিরোধ করে। যেহেতু EF Core এটি স্বয়ংক্রিয়ভাবে parameterized query হিসেবে ট্রান্সফর্ম করে, তাই SQL Injection এর সুযোগ থাকে না।
কিন্তু, যদি Raw SQL কুয়েরি ব্যবহার করেন, তখন আপনাকে প্যারামিটারাইজড কুয়েরি ব্যবহার করতে হবে:
var users = context.Users
.FromSqlRaw("SELECT * FROM Users WHERE Name = {0}", userName)
.ToList();
এখানে {0}
প্যারামিটার ব্যবহার করা হয়েছে, যাতে SQL Injection প্রতিরোধ হয়।
Entity Framework Core আপনাকে সঠিকভাবে Sensitive Data পরিচালনা করার সুযোগ দেয়, কিন্তু ডেটা এনক্রিপশন এবং সুরক্ষা নিয়ন্ত্রণ আপনার অ্যাপ্লিকেশনে সঠিকভাবে কনফিগার করা উচিত।
ডেটাবেসের মধ্যে সংরক্ষিত সেন্টিভ ডেটা (যেমন পাসওয়ার্ড, ক্রেডেনশিয়াল) এনক্রিপ্ট করা উচিত। এটি ডেটাবেস স্তরের সুরক্ষার একটি গুরুত্বপূর্ণ অংশ। EF Core নিজে থেকে এনক্রিপশন ম্যানেজ করে না, তবে আপনি Azure Key Vault বা অন্যান্য এনক্রিপশন সেবা ব্যবহার করতে পারেন।
ডেটাবেসে সংরক্ষিত সংবেদনশীল ডেটা শুধুমাত্র এনক্রিপ্টেড চ্যানেল দিয়ে পরিবহন (transported) করা উচিত। এজন্য SSL/TLS ব্যবহার করতে পারেন, যা EF Core-এর মাধ্যমে নিরাপদ সংযোগ সরবরাহ করবে।
Sensitive ডেটা যেমন পাসওয়ার্ড বা কার্ড নম্বরকে দৃশ্যমান না রেখে, আপনি Data Annotations অথবা Fluent API ব্যবহার করে এই ডেটাগুলোকে মাস্ক করতে পারেন।
EF Core ব্যবহারকারী ডেটাবেসের মধ্যে ক্রিপ্টেড এবং এনক্রিপ্টেড ডেটা হ্যান্ডল করার জন্য কাস্টম এনক্রিপশন ফিচার ব্যবহার করতে পারে।
Entity Framework Core তে নিরাপত্তা কনফিগারেশন সাধারণত অ্যাপ্লিকেশনের ইউজারদের Authorization এবং Role-based Access Control (RBAC) দ্বারা নিয়ন্ত্রণ করা হয়। ASP.NET Core এর Identity সিস্টেমের মাধ্যমে EF Core ব্যবহার করে আপনি অ্যাপ্লিকেশনটির সিকিউরিটি ম্যানেজ করতে পারেন।
public class ApplicationUser : IdentityUser
{
// Custom fields for the user
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<ApplicationUser> Users { get; set; }
}
এখানে IdentityDbContext
ব্যবহার করা হয়েছে, যার মাধ্যমে ব্যবহারকারীদের লগইন, রেজিস্ট্রেশন এবং তাদের রোল ম্যানেজমেন্ট করা হয়। EF Core Identity সিস্টেমটি রোল-ভিত্তিক নিরাপত্তা কনফিগার করার জন্য সঠিক পদ্ধতি প্রদান করে।
public class MyController : Controller
{
public IActionResult AdminPanel()
{
if (User.IsInRole("Admin"))
{
return View();
}
else
{
return RedirectToAction("AccessDenied");
}
}
}
এখানে, IsInRole মেথড ব্যবহার করে নিশ্চিত করা হয়েছে যে, শুধুমাত্র "Admin" রোলের ব্যবহারকারী অ্যাডমিন প্যানেলে অ্যাক্সেস করতে পারবে।
Concurrency একটি গুরুত্বপূর্ণ নিরাপত্তা এবং পারফরম্যান্স বিষয়, বিশেষত যখন একাধিক ব্যবহারকারী একে অপরের সঙ্গে একে একে ডেটা আপডেট করছে। Optimistic Concurrency হল এমন একটি কৌশল, যার মাধ্যমে একাধিক ব্যবহারকারী একই ডেটা একযোগে সম্পাদনা করতে পারবে, তবে সমস্যা হলে সঠিকভাবে কনফ্লিক্ট ম্যানেজ করা হবে।
EF Core তে Concurrency Control এর জন্য Timestamp
বা RowVersion
ব্যবহার করা হয়।
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; } // RowVersion for concurrency control
}
এখানে, RowVersion
প্রপার্টি ব্যবহার করে Optimistic Concurrency নিশ্চিত করা হয়েছে। যখন দুটি ব্যবহারকারী একই রেকর্ড আপডেট করার চেষ্টা করবে, তখন EF Core কনফ্লিক্ট সনাক্ত করবে এবং তা মোকাবেলা করতে সাহায্য করবে।
Entity Framework Core আপনাকে ডেটাবেসের কার্যক্রম ট্র্যাক করার জন্য Audit Logging বাস্তবায়ন করতে সাহায্য করে, যাতে আপনি জানেন কখন এবং কে ডেটাবেসে পরিবর্তন করেছেন। এই সিস্টেমটি সিকিউরিটি অডিট এবং ট্ৰাবলশুটিংয়ের জন্য খুবই উপকারী।
Entity Framework Core এর সাথে সুরক্ষা ফিচারগুলি ব্যবহার করার মাধ্যমে আপনি আপনার অ্যাপ্লিকেশন এবং ডেটাবেসকে নিরাপদ রাখতে পারেন। SQL Injection প্রতিরোধ, ডেটা এনক্রিপশন, সেনসিটিভ ডেটা হ্যান্ডলিং, রোল-বেসড অথরাইজেশন, এবং কনকারেন্সি কন্ট্রোলের মাধ্যমে সঠিক নিরাপত্তা ব্যবস্থা তৈরি করা সম্ভব। EF Core সিকিউরিটি ফিচারগুলির সঠিক ব্যবহারে আপনি একটি শক্তিশালী এবং সুরক্ষিত অ্যাপ্লিকেশন তৈরি করতে পারবেন।
SQL Injection হল একটি সিকিউরিটি দুর্বলতা, যা তখন ঘটে যখন একজন আক্রমণকারী ব্যবহারকারীর ইনপুটের মাধ্যমে SQL কুয়েরি পরিবর্তন করে। এটি ডেটাবেসে অবৈধ অ্যাক্সেস প্রদান করতে পারে, এবং ডেটা চুরি, পরিবর্তন বা ধ্বংস করতে পারে। এই ধরনের আক্রমণ থেকে রক্ষা পেতে সঠিক কৌশল এবং পদ্ধতি ব্যবহার করা খুবই গুরুত্বপূর্ণ।
Entity Framework (EF) এবং ASP.NET Core ব্যবহার করে SQL Injection প্রতিরোধ করার জন্য বেশ কিছু উন্নত নিরাপত্তা ব্যবস্থা গ্রহণ করা যায়। চলুন, আমরা এর কিছু পদ্ধতি সম্পর্কে বিস্তারিত জানি।
SQL Injection সাধারণত ঘটে যখন দূর্বল কুয়েরি বিল্ডিং ব্যবহার করা হয়, যেমন:
string query = "SELECT * FROM Users WHERE UserName = '" + userName + "' AND Password = '" + password + "'";
এখানে, আক্রমণকারী userName
বা password
ফিল্ডে ক্ষতিকারক SQL কোড ইনজেক্ট করতে পারে, যেমন:
' OR '1' = '1
এটা দিয়ে আক্রমণকারী সিস্টেমে অযাচিত অ্যাক্সেস পেতে পারে।
SQL Injection প্রতিরোধের জন্য Parameterized Queries ব্যবহার করা খুবই গুরুত্বপূর্ণ। এটি SQL কুয়েরি এবং ইনপুট ডেটা আলাদা রাখে, যার ফলে ইনপুট ডেটা কোনো SQL কোড হিসেবে বিবেচিত হয় না। Entity Framework (EF) স্বাভাবিকভাবেই parameterized queries ব্যবহার করে, তাই এটি অনেক নিরাপদ।
var users = _context.Users
.Where(u => u.UserName == userName && u.Password == password)
.ToList();
এখানে, EF Core স্বয়ংক্রিয়ভাবে parameterized query তৈরি করে এবং ইনপুট ডেটা parameterized values হিসেবে পাঠায়, যাতে কোনো SQL Injection হতে না পারে।
Stored Procedures হল ডেটাবেসে সংরক্ষিত SQL কোড যা প্রিপেয়ারড স্টেটমেন্টের মতো কাজ করে। Stored Procedures ব্যবহার করার মাধ্যমে SQL Injection এর ঝুঁকি অনেক কমে যায়, কারণ এই কোডগুলো ডেটাবেসে একবারে কম্পাইল এবং সংরক্ষিত থাকে, এবং তারা ইনপুট ভ্যালিডেশন করতে সক্ষম।
CREATE PROCEDURE GetUserInfo
@UserName NVARCHAR(50),
@Password NVARCHAR(50)
AS
BEGIN
SELECT * FROM Users WHERE UserName = @UserName AND Password = @Password;
END
এটি Entity Framework তে কল করার জন্য:
var users = _context.Users.FromSqlRaw("EXEC GetUserInfo @UserName, @Password", userName, password).ToList();
এখানে, Stored Procedure ব্যবহার করে ইনপুট এবং কুয়েরি আলাদা রাখা হয়েছে, যা SQL Injection প্রতিরোধ করে।
Entity Framework (EF) এর মতো Object-Relational Mapping (ORM) টুলস স্বয়ংক্রিয়ভাবে parameterized কুয়েরি তৈরি করে, যা SQL Injection থেকে রক্ষা করে। EF এর LINQ কুয়েরি রাইটিং ব্যবহারের মাধ্যমে, SQL কুয়েরি তৈরি হয় নিরাপদভাবে।
var users = _context.Users
.Where(u => u.UserName == userName && u.Password == password)
.ToList();
EF এর LINQ সঠিকভাবে ইনপুট ডেটা স্যানিটাইজ করে এবং SQL Injection প্রতিরোধ করে।
Input validation হল একটি গুরুত্বপূর্ণ নিরাপত্তা ব্যবস্থা, যা নিশ্চিত করে যে ব্যবহারকারী শুধুমাত্র অনুমোদিত ইনপুট প্রদান করবে। SQL Injection আক্রমণের সবচেয়ে সাধারণ উপায় হল ব্যবহারকারীর ইনপুটে অবৈধ ডেটা পাঠানো। তাই ব্যবহারকারীর ইনপুট যাচাই করা এবং বিশেষ চিহ্নগুলো স্যানিটাইজ করা গুরুত্বপূর্ণ।
উদাহরণস্বরূপ, username এর মধ্যে অপ্রত্যাশিত চরিত্র যেমন '
, "
, ;
, বা --
থাকতে পারবে না। ইনপুট ফিল্ডগুলোর জন্য সঠিক ভ্যালিডেশন নিয়ম থাকা উচিত।
ডেটাবেস অ্যাক্সেসের জন্য শুধুমাত্র প্রয়োজনীয় পারমিশন দেওয়া উচিত। Least Privilege Principle অনুযায়ী, প্রতিটি ইউজারের কাছে শুধুমাত্র তাদের প্রয়োজনীয় অ্যাক্সেস দেওয়া উচিত। এতে আক্রমণকারী যদি কোনোভাবে SQL Injection মাধ্যমে সিস্টেমে প্রবেশ করে, তবুও তাদের কাছে প্রয়োজনীয় ক্ষমতা থাকবে না।
SQL Injection প্রতিরোধ করতে Parameterized Queries, Stored Procedures, ORM (Entity Framework), Input Validation, এবং Least Privilege Principle এর মতো নিরাপত্তা কৌশল অবলম্বন করা উচিত। এর মাধ্যমে আপনার অ্যাপ্লিকেশন ডেটাবেস অ্যাক্সেস নিরাপদ থাকে এবং ব্যবহারকারীর ডেটা সুরক্ষিত থাকে।
ডেটা এনক্রিপশন এবং সেনসিটিভ ডেটা হ্যান্ডলিং হল তথ্য সুরক্ষার মৌলিক পদ্ধতি, যা বিভিন্ন ধরনের ডেটা রক্ষা করতে ব্যবহৃত হয়। আজকাল, যখন ডিজিটাল ট্রান্সাকশন এবং কমিউনিকেশন ব্যাপকভাবে বৃদ্ধি পাচ্ছে, তখন সেনসিটিভ (গোপনীয়) ডেটার সুরক্ষা অত্যন্ত গুরুত্বপূর্ণ হয়ে উঠেছে। এটি নিশ্চিত করে যে, অননুমোদিত ব্যক্তিরা ডেটা অ্যাক্সেস করতে পারবে না এবং শুধুমাত্র অনুমোদিত ব্যবহারকারীরা তথ্যের সাথে কাজ করতে পারবে।
ডেটা এনক্রিপশন হল এমন একটি প্রক্রিয়া যার মাধ্যমে স্পষ্ট পাঠ্য বা তথ্যকে একটি কোডে রূপান্তরিত করা হয়, যাতে এটি অজ্ঞাত এবং অসংলগ্ন হয়। এনক্রিপশন প্রযুক্তি, ডেটা স্টোরেজ এবং ট্রান্সমিশনের সময় ডেটা সুরক্ষিত রাখতে সহায়তা করে।
সেনসিটিভ ডেটা এমন ডেটা যা ব্যক্তিগত বা সংবেদনশীল তথ্য ধারণ করে এবং যদি এটি ফাঁস হয়ে যায় বা অসতর্কভাবে ব্যবহৃত হয়, তবে এটি ব্যক্তি বা প্রতিষ্ঠানের জন্য ঝুঁকি তৈরি করতে পারে। এর মধ্যে অন্তর্ভুক্ত থাকে:
সেনসিটিভ ডেটা সুরক্ষায় বিভিন্ন আন্তর্জাতিক এবং জাতীয় আইন এবং নীতিমালা রয়েছে, যা সংস্থাগুলিকে সঠিকভাবে ডেটা সুরক্ষা নিশ্চিত করার জন্য বাধ্য করে। কিছু উল্লেখযোগ্য আইন ও স্ট্যান্ডার্ড হল:
ডেটা এনক্রিপশন এবং সেনসিটিভ ডেটা হ্যান্ডলিং এমন দুটি গুরুত্বপূর্ণ প্রক্রিয়া যা ডিজিটাল যুগে ডেটার সুরক্ষা নিশ্চিত করে। এনক্রিপশন ডেটা নিরাপদ রাখার জন্য একটি শক্তিশালী পদ্ধতি, যেখানে সেনসিটিভ ডেটার সুরক্ষায় বিভিন্ন পদক্ষেপ যেমন অ্যাক্সেস কন্ট্রোল, ডেটা মাস্কিং, এবং মনিটরিং প্রয়োগ করা হয়। এটি নিশ্চিত করে যে শুধু অনুমোদিত ব্যক্তি বা সিস্টেমের কাছে সেনসিটিভ ডেটা পৌঁছাবে, এবং আইনি সঙ্গতি নিশ্চিত করার জন্যও গুরুত্বপূর্ণ।
ASP.NET Identity হল একটি ফ্রেমওয়ার্ক যা ASP.NET অ্যাপ্লিকেশনগুলিতে ব্যবহারকারী এবং তাদের ভূমিকা (roles), অথেনটিকেশন (authentication), এবং অথরাইজেশন (authorization) পরিচালনা করার জন্য ব্যবহৃত হয়। Entity Framework (EF) এর সাথে ASP.NET Identity ইন্টিগ্রেট করলে, আপনি ডেটাবেসে ব্যবহারকারীর তথ্য সঞ্চয় এবং ব্যবস্থাপনা করতে পারবেন, যেমন পাসওয়ার্ড, রোল, লগইন তথ্য ইত্যাদি।
ASP.NET Identity এবং Entity Framework একসাথে কাজ করে ব্যবহারকারীর সুরক্ষা এবং অ্যাপ্লিকেশন নিরাপত্তা নিশ্চিত করতে। ASP.NET Identity সাধারণত EF Core বা EF 6 এর উপর ভিত্তি করে কাজ করে, এবং এটি ডেটাবেস টেবিল তৈরি এবং পরিচালনা করার জন্য EF এর মাইগ্রেশন সিস্টেম ব্যবহার করে।
ASP.NET Identity কয়েকটি গুরুত্বপূর্ণ উপাদান দিয়ে গঠিত:
EF এর সাথে ASP.NET Identity ইন্টিগ্রেট করার জন্য, প্রথমে Identity প্যাকেজ ইনস্টল করতে হবে এবং তারপর ডেটাবেস কনটেক্সট (DbContext) কনফিগার করতে হবে।
NuGet Package Manager ব্যবহার করে ASP.NET Identity প্যাকেজ ইনস্টল করতে হবে।
NuGet প্যাকেজ ইনস্টল করা:
Visual Studio তে NuGet Package Manager ব্যবহার করে ASP.NET Identity ইনস্টল করতে নিচের কমান্ডটি চালান:
Install-Package Microsoft.AspNetCore.Identity.EntityFrameworkCore
এই প্যাকেজটি ASP.NET Identity এবং EF Core এর মধ্যে ইন্টিগ্রেশন করতে সহায়ক হবে।
ApplicationDbContext হল একটি ক্লাস যা ASP.NET Identity এবং EF Core ডেটাবেস কনটেক্সট ম্যানেজ করে। এটি IdentityDbContext ক্লাস থেকে ইনহেরিট করা হয় এবং Identity সম্পর্কিত টেবিলগুলো (যেমন, Users, Roles) তৈরি করতে সাহায্য করে।
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
// অন্যান্য DbSet গুলি এখানে যুক্ত করুন
public DbSet<Product> Products { get; set; }
}
এখানে, ApplicationUser
হল IdentityUser থেকে ইনহেরিট করা কাস্টম ইউজার ক্লাস যা আপনি ব্যবহারকারীদের সম্পর্কিত অতিরিক্ত তথ্য (যেমন, Full Name) সঞ্চয় করার জন্য কাস্টমাইজ করতে পারেন।
ApplicationUser ক্লাসটি ASP.NET Identity এর ইউজার মডেল, এবং এটিতে আপনি অতিরিক্ত প্রপার্টি যোগ করতে পারেন যেমন, নাম, জন্মতারিখ ইত্যাদি। এটি IdentityUser থেকে ইনহেরিট করা হয়।
public class ApplicationUser : IdentityUser
{
public string FullName { get; set; }
}
ASP.NET Core অ্যাপ্লিকেশনটি শুরু করার সময়, Identity কনফিগারেশনটি Startup.cs ফাইলে করতে হয়। এখানে AddIdentity
মেথড ব্যবহার করা হয় Identity কনফিগার করতে।
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddControllersWithViews();
}
}
এখানে, ApplicationDbContext এবং ApplicationUser যুক্ত করা হয়েছে এবং AddEntityFrameworkStores<ApplicationDbContext>()
মেথডটি EF এর সাথে Identity ইন্টিগ্রেট করার জন্য ব্যবহার করা হয়েছে।
EF Core ব্যবহার করার ফলে ASP.NET Identity ডেটাবেস টেবিলগুলো তৈরি করার জন্য মাইগ্রেশন ব্যবহার করতে হবে। মাইগ্রেশনগুলির মাধ্যমে Identity সম্পর্কিত টেবিলগুলো ডেটাবেসে তৈরি হবে, যেমন AspNetUsers
, AspNetRoles
, AspNetUserRoles
ইত্যাদি।
মাইগ্রেশন তৈরি করা:
Add-Migration InitialCreate
ডেটাবেস আপডেট করা:
Update-Database
এটি EF Core মাইগ্রেশন ব্যবহার করে ডেটাবেসে ASP.NET Identity এর জন্য প্রয়োজনীয় টেবিলগুলো তৈরি করবে।
ASP.NET Identity এর মাধ্যমে ইউজার সাইন ইন এবং সাইন আউট করতে SignInManager ব্যবহার করা হয়।
var result = await _signInManager.PasswordSignInAsync(user, password, rememberMe: false, lockoutOnFailure: false);
if (result.Succeeded)
{
// সাইন ইন সফল
}
await _signInManager.SignOutAsync();
ASP.NET Identity এ রোল (roles) ব্যবহারের মাধ্যমে আপনি বিভিন্ন ইউজারের জন্য বিভিন্ন অ্যাকসেস পারমিশন সেট করতে পারেন। রোল যোগ করতে এবং ইউজারের সাথে রোল অ্যাসাইন করতে RoleManager ব্যবহার করা হয়।
var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
if (!await roleManager.RoleExistsAsync("Admin"))
{
var role = new IdentityRole("Admin");
await roleManager.CreateAsync(role);
}
var user = await _userManager.FindByNameAsync("username");
await _userManager.AddToRoleAsync(user, "Admin");
EF এর সাথে ASP.NET Identity ইন্টিগ্রেট করলে, আপনি অথেনটিকেশন এবং অথরাইজেশন এর প্রক্রিয়াগুলি সুষ্ঠুভাবে পরিচালনা করতে পারবেন। Identity প্যাকেজটি ডেটাবেসে ইউজার এবং রোল তথ্য সংরক্ষণ করার সুবিধা দেয়, এবং EF Core মাইগ্রেশন ব্যবহারের মাধ্যমে Identity টেবিলগুলি সহজেই তৈরি করা যায়। Identity Manager, RoleManager, এবং SignInManager এর মতো টুলস ব্যবহার করে ইউজার ম্যানেজমেন্ট আরও শক্তিশালী হয়।
Authorization হল নিরাপত্তার একটি গুরুত্বপূর্ণ অংশ যা ব্যবহৃত হয় ব্যবহারকারীদের অ্যাপ্লিকেশন বা সিস্টেমের বিভিন্ন অংশে অ্যাক্সেস নিয়ন্ত্রণ করতে। এটি নিশ্চিত করে যে, একটি ব্যবহারকারী কোন রিসোর্সে প্রবেশ করতে পারবে এবং কোন কাজ করতে পারবে, এবং কোন রিসোর্সে তাকে প্রবেশের অনুমতি নেই। Role-based Security হল একটি পদ্ধতি যা ব্যবহারকারীদের বিভিন্ন Roles প্রদান করে এবং সেই অনুযায়ী তাদের অ্যাক্সেস নিয়ন্ত্রণ করে।
Authorization ব্যবহৃত হয় ব্যবহারকারী বা গ্রুপের জন্য একটি নির্দিষ্ট কাজ বা রিসোর্সে অ্যাক্সেসের অনুমতি প্রদান করার জন্য। এটি সাধারণত Authentication এর পরে চলে, যেখানে প্রথমে ব্যবহারকারীর পরিচয় যাচাই করা হয় এবং পরে তার অ্যাক্সেস অধিকার নির্ধারণ করা হয়।
Authorization নিশ্চিত করে যে:
Authorization সাধারনত Access Control Lists (ACLs) বা Claims-based Security এর মাধ্যমে পরিচালিত হয়।
Role-based Security বা Role-based Access Control (RBAC) একটি নিরাপত্তা মডেল যেখানে ব্যবহারকারীদের একটি নির্দিষ্ট Role বা ভূমিকা দেয়া হয় এবং সেই অনুযায়ী তাদের সিস্টেমের বা অ্যাপ্লিকেশনের অংশে অ্যাক্সেস অনুমোদিত হয়। এর মাধ্যমে সহজেই বড় সিস্টেম বা অ্যাপ্লিকেশনে ব্যবহারকারীদের অ্যাক্সেস নিয়ন্ত্রণ করা যায়।
যে ব্যবহারকারীদের এক ধরনের দায়িত্ব বা ভূমিকা (Role) থাকে, তাদের সেই অনুযায়ী permission বা অনুমতি প্রদান করা হয়। উদাহরণস্বরূপ:
ASP.NET Core তে Authorization এবং Role-based Security বাস্তবায়ন করা খুব সহজ। এর জন্য ASP.NET Core এর Identity Framework এবং Claims-based Authorization ব্যবহার করা হয়।
ASP.NET Core Identity হল একটি পূর্ণাঙ্গ সিস্টেম যা ব্যবহারকারী পরিচালনা, লগইন, রেজিস্ট্রেশন, পাসওয়ার্ড পুনরুদ্ধার এবং Authorization পরিচালনা করে। এতে সহজেই Role-based Security বাস্তবায়ন করা যায়।
public class ApplicationUser : IdentityUser
{
// Custom properties (if any)
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
}
এখানে:
IdentityUser
হল ASP.NET Core Identity এর প্রাক-নির্ধারিত ক্লাস যা ব্যবহারকারীদের জন্য প্রয়োজনীয় সকল তথ্য সংরক্ষণ করে।ApplicationDbContext
Identity এর ডেটাবেস কনটেক্সট। এটি ব্যবহারকারীদের লগইন, রেজিস্ট্রেশন ইত্যাদি পরিচালনা করে।ASP.NET Core তে ব্যবহারকারীদের Role ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ করার জন্য [Authorize] অ্যাট্রিবিউট এবং RoleManager ব্যবহার করা হয়। RoleManager ব্যবহার করে Roles তৈরি এবং প্রয়োগ করা হয়।
public class SeedData
{
public static async Task Initialize(IServiceProvider serviceProvider, UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager)
{
var roleNames = new[] { "Admin", "Manager", "User" };
foreach (var roleName in roleNames)
{
var roleExist = await roleManager.RoleExistsAsync(roleName);
if (!roleExist)
{
await roleManager.CreateAsync(new IdentityRole(roleName));
}
}
// Create admin user
var adminUser = await userManager.FindByEmailAsync("admin@example.com");
if (adminUser == null)
{
adminUser = new ApplicationUser { UserName = "admin@example.com", Email = "admin@example.com" };
await userManager.CreateAsync(adminUser, "Admin@123");
}
// Assign role to admin
if (!await userManager.IsInRoleAsync(adminUser, "Admin"))
{
await userManager.AddToRoleAsync(adminUser, "Admin");
}
}
}
এখানে:
"Admin"
, "Manager"
, এবং "User"
নামক রোলগুলো তৈরি করা হয়েছে।একটি কন্ট্রোলারের অ্যাকশন বা পৃষ্ঠা নির্দিষ্ট রোলের জন্য সীমাবদ্ধ করতে [Authorize] অ্যাট্রিবিউট ব্যবহার করা হয়।
[Authorize(Roles = "Admin")]
public IActionResult AdminDashboard()
{
return View();
}
[Authorize(Roles = "Manager,Admin")]
public IActionResult ManagerDashboard()
{
return View();
}
[Authorize(Roles = "User")]
public IActionResult UserDashboard()
{
return View();
}
এখানে:
common.read_more